#!/usr/bin/python
# encoding: utf-8
'''
@File    :   code.py
@Time    :   2020/03/11 21:54:19
@Author  :   fangkaijin 
@Version :   1.0
@Contact :   fangkaijin@gmail.com
@License :   杭州移动互联
@Desc    :   None
'''

# 导入库包

import sys, os

from sqlalchemy import *
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import *
import datetime

print(sqlalchemy.__version__)

engine = create_engine('sqlite:///test.db')

Base = declarative_base()

class User(Base):
    #指定本类映射到users表
    __tablename__ = 'users'
    # 如果有多个类指向同一张表，那么在后边的类需要把extend_existing设为True，表示在已有列基础上进行扩展
    # 或者换句话说，sqlalchemy允许类是表的字集
    # __table_args__ = {'extend_existing': True}
    # 各变量名一定要与表的各字段名一样，因为相同的名字是他们之间的唯一关联关系
    # 从语法上说，各变量类型和表的类型可以不完全一致，如表字段是String(64)，但我就定义成String(32)
    # 但为了避免造成不必要的错误，变量的类型和其对应的表的字段的类型还是要相一致
    # 指定id映射到id字段; id字段为整型，为主键
    id = Column(Integer, primary_key=true)
    # 指定name映射到name字段; name字段为字符串类形，
    name = Column(String(32))
    fullname = Column(String(32))
    addresss = Column(String(128))
    salary = Column(String(8))
    createTime = sqlalchemy.Column('createtime', sqlalchemy.DateTime, default=datetime.datetime.now())

    #用于打印数据
    def toString(self):
        print('users表数据 name = %s , fullname = %s , address = %s , salary = %s .' % (self.name, self.fullname, self.addresss, self.salary))

print(User.__table__)
# 创建数据表。一方面通过engine来连接数据库，另一方面根据哪些类继承了Base来决定创建哪些表
# checkfirst=True，表示创建表前先检查该表是否存在，如同名表已存在则不再创建。其实默认就是True
Base.metadata.create_all(engine, checkfirst=True)
# 上边的写法会在engine对应的数据库中创建所有继承Base的类对应的表，但很多时候很多只是用来则试的或是其他库的
# 此时可以通过tables参数指定方式，指示仅创建哪些表
# Base.metadata.create_all(engine,tables=[Base.metadata.tables['users']],checkfirst=True)
# 在项目中由于model经常在别的文件定义，没主动加载时上边的写法可能写导致报错，可使用下边这种更明确的写法
# User.__table__.create(engine, checkfirst=True)
# 另外我们说这一步的作用是创建表，当我们已经确定表已经在数据库中存在时，我完可以跳过这一步
# 针对已存放有关键数据的表，或大家共用的表，直接不写这创建代码更让人心里踏实

# engine是2.2中创建的连接
Session = sessionmaker(bind=engine)
# 创建Session类实例
session = Session()
# 创建User类实例
ed_user = User(name='ed', fullname='Ed Jones', addresss='杭州，余杭', salary = '3200')
# 将该实例插入到users表
session.add(ed_user)
# 当前更改只是在session中，需要使用commit确认更改才会写入数据库
session.commit()


our_user = session.query(User).filter_by(name='ed').first()

our_user.toString()

session.close()
